package javacroft.view.GUI;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javacroft.facade.Facade;
import javacroft.view.MouseOverHintManager;
import javacroft.view.MyPanel;
import javacroft.view.ViewIF;
import javax.swing.*;

/**
 * Classe qui permet à l'utilisateur (responsable d'UE) dajouter ou suprimer des APDJ aux etudiants de l'UE dont il est responsable. Il peut aussi voir toutes les notes des ECUE qui se trouve dans l'UE choisie.
 * @author julien
 */
public class ResponsableUE extends JFrame implements ViewIF, ActionListener
{

   Facade myControlleur;
   Principale myAccueil;
   Toolkit tk;
   Dimension ecran;
   DecimalFormat df;
   MouseOverHintManager hintManager;
   int currentDateInt;
   int currentNbEtud, currentNbNotes;
   JComboBox boxDepartements, boxAnnee, boxUE;
   JButton alphaButton[] =
   {
      new JButton("A-D"), new JButton("E-M"), new JButton("N-Q"), new JButton("R-Z"), new JButton("Tous")
   };
   JButton boutonImporter, Valider, Actualiser;
   JTextField jtfMax, jtfMin, jtfTotal, jtfMoyenne;//, jtfValid, jtfEchoue;
   JMenuItem Nouveau, Importer, Exporter, Enregistrer, Quitter, Support, APropos;
   MyPanel Fond;
   JPanel conteneur;
   GridBagConstraints contrainte;
   JPanel panelStats;
   JPanel panelEtudiants = new JPanel(new FlowLayout());
   JPanel labelPanel;
   JPanel blocEtudiants;
   JPanel infosEtudiants;
   JLabel numEtudiants[];
   JTextField lesEtudiants[][];
   JCheckBox[] APDJEtudiant;
   JScrollPane ascenseur;
   JTextArea labelBulle;
   Font police = new Font("Serif", 0, 20);
   Font policeBulle = new Font("Serif", 0, 15);
   JLayeredPane superpoz = new JLayeredPane();
   JLabel sablier = new JLabel();
   String oldNote = "";
   int nbModifications = 0;

   /**
    * Constructeur de la classe, positionne tous les composants
    * @param unControlleur Facade de la vue, qui lui fournit tous les services nécessaires
    * @param uneAccueil Fenetre d'accueil de l'utilisateur qui est réaffichée si l'on quitte la fenetre pour lui permettre d'efectuer d'autres actions.
    */
   public ResponsableUE(Facade unControlleur, Principale uneAccueil)
   {
      super("Gestion des APDJ des étudiants");
      myControlleur = unControlleur;
      unControlleur.setView((ViewIF) this);
      this.myAccueil = uneAccueil;

      tk = Toolkit.getDefaultToolkit();
      ecran = tk.getScreenSize();

      contrainte = new GridBagConstraints();

      df = new DecimalFormat("#.##");

      labelPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
      labelBulle = new JTextArea();
      labelBulle.setEditable(false);
      labelBulle.setFont(policeBulle);
      labelBulle.setFont(labelBulle.getFont().deriveFont(Font.BOLD));
      hintManager = new MouseOverHintManager(new JLabel(), labelBulle);

      currentNbEtud = currentNbNotes = 0;// nbValid = nbEchoue = 0;
      //max = min = moyenne = currentNote = 0;

      boxDepartements = new JComboBox();
      boxAnnee = new JComboBox();
      boxUE = new JComboBox();

      boutonImporter = new JButton("Importer");
      Valider = new JButton("Valider");

      Actualiser = new JButton("Actualiser");

      jtfMax = new JTextField();
      jtfMin = new JTextField();
      jtfTotal = new JTextField();
      jtfMoyenne = new JTextField();
      //jtfValid = new JTextField();
      //jtfEchoue = new JTextField();

      Nouveau = new JMenuItem("Nouveau");
      Importer = new JMenuItem("Importer");
      Exporter = new JMenuItem("Exporter");
      Enregistrer = new JMenuItem("Enregistrer");
      Quitter = new JMenuItem("Quitter");
      Support = new JMenuItem("Support");
      APropos = new JMenuItem("A Propos");

      Fond = new MyPanel("ecran8.jpg", 1024, 768);
      Fond.setLayout(new FlowLayout(0, 10, 0));
      conteneur = new JPanel();
      conteneur.setLayout(new GridBagLayout());

      panelStats = new JPanel(new FlowLayout());
      infosEtudiants = new JPanel(new FlowLayout());
      numEtudiants = new JLabel[70];
      APDJEtudiant = new JCheckBox[numEtudiants.length];

      blocEtudiants = new JPanel(new BorderLayout());

      //estUnEtudiant = new Boolean[numEtudiants.length];
      //estVisible = new Boolean[numEtudiants.length];

      //**Menu fichier
      Nouveau.setActionCommand("Nouveau");
      Nouveau.addActionListener(this);
      Importer.setActionCommand("Importer");
      Importer.addActionListener(this);
      Exporter.setActionCommand("Exporter");
      Exporter.addActionListener(this);
      Enregistrer.setActionCommand("Valider");
      Enregistrer.addActionListener(this);
      Quitter.setActionCommand("Quitter");
      Quitter.addActionListener(this);
      JMenu menuFichier = new JMenu("Fichier");
      menuFichier.add(Nouveau);
      menuFichier.add(Importer);
      menuFichier.add(Exporter);
      menuFichier.add(Enregistrer);
      menuFichier.add(Quitter);

      //**Menu aide
      Support.setActionCommand("Support");
      Support.addActionListener(this);
      JMenu menuAide = new JMenu("Aide");
      menuAide.add(Support);

      //**Menu A Propos
      APropos.setActionCommand("APropos");
      APropos.setPreferredSize(new Dimension(50, 20));
      APropos.addActionListener(this);

      //**barre des menus
      JMenuBar barreMenu = new JMenuBar();
      barreMenu.add(menuFichier);
      barreMenu.add(menuAide);
      barreMenu.add(APropos);

      JLabel labelDepartement = new JLabel("1. Choix du département:");
      labelDepartement.setForeground(Color.black);
      labelDepartement.setPreferredSize(new Dimension(350, 30));
      labelDepartement.setFont(police);
      contrainte.insets = new Insets(20, 0, 0, 0);
      contrainte.gridwidth = 4;
      contrainte.gridx = 0;
      contrainte.gridy = 0;
      conteneur.add(labelDepartement, contrainte);
      boxDepartements.setPreferredSize(new Dimension(300, 20));
      boxDepartements.setActionCommand("changeDep");
      hintManager.addHintFor(boxDepartements, "Selectionez le département pour lequel vous voulez entrer des notes.");
      contrainte.gridwidth = 0;
      contrainte.gridx = 4;
      conteneur.add(boxDepartements, contrainte);

      JLabel labelAnnee = new JLabel("2. Choix de l'année:");
      labelAnnee.setForeground(Color.black);
      labelAnnee.setPreferredSize(new Dimension(350, 30));
      labelAnnee.setFont(police);
      contrainte.gridwidth = 4;
      contrainte.gridx = 0;
      contrainte.gridy = 1;
      conteneur.add(labelAnnee, contrainte);

      boxAnnee.setPreferredSize(new Dimension(300, 20));
      boxAnnee.setActionCommand("changeAnnee");
      hintManager.addHintFor(boxAnnee, "Selectionez l'année pour laquelle vous voulez entrer des notes.");
      contrainte.gridwidth = 0;
      contrainte.gridx = 4;
      conteneur.add(boxAnnee, contrainte);

      JLabel labelUE = new JLabel("3. Choix de l'UE:");

      labelUE.setPreferredSize(new Dimension(350, 30));
      labelUE.setForeground(Color.black);
      labelUE.setFont(police);
      contrainte.gridwidth = 4;
      contrainte.gridx = 0;
      contrainte.gridy = 2;
      conteneur.add(labelUE, contrainte);

      boxUE.setPreferredSize(new Dimension(300, 20));
      boxUE.setActionCommand("changeUE");
      hintManager.addHintFor(boxUE, "Selectionez l'UE pour laquelle vous voulez donner des APDJ.");
      contrainte.gridwidth = 0;
      contrainte.gridx = 4;
      conteneur.add(boxUE, contrainte);

      //**boutons pour l'ordre alphabétique
      JPanel panelBoutons = new JPanel(new FlowLayout());
      for (int i = 0; i < 5; i++)
      {
         alphaButton[i].addActionListener(this);
         alphaButton[i].setOpaque(false);
         alphaButton[i].setEnabled(false);
         panelBoutons.add(alphaButton[i]);
         if (i != 4)
         {
            alphaButton[i].setActionCommand((new StringBuilder()).append(Character.toString(alphaButton[i].getText().charAt(0))).append(Character.toString(alphaButton[i].getText().charAt(2))).toString());
         }
         else
         {
            alphaButton[i].setActionCommand("AZ");
         }
         hintManager.addHintFor(alphaButton[i], (new StringBuilder()).append("Cliquez pour afficher les étudiants dont le nom est entre ").append(alphaButton[i].getActionCommand().charAt(0)).append(" et ").append(alphaButton[i].getActionCommand().charAt(1)).toString());
      }

      contrainte.gridx = 1;
      contrainte.gridy = 4;
      contrainte.gridwidth = 4;
      conteneur.add(panelBoutons, contrainte);


      panelEtudiants.setPreferredSize(new Dimension(550, 290));
      panelEtudiants.setBorder(BorderFactory.createTitledBorder(""));

      labelPanel.setPreferredSize(new Dimension(470, 25));

      JLabel labelNum = new JLabel("N°");
      labelNum.setPreferredSize(new Dimension(30, 20));
      labelNum.setForeground(Color.black);
      labelNum.setFont(police);
      labelPanel.add(labelNum);

      JLabel labelNom = new JLabel("Nom");
      labelNom.setPreferredSize(new Dimension(150, 20));
      labelNom.setForeground(Color.black);
      labelNom.setFont(police);
      labelPanel.add(labelNom);

      JLabel labelPrenom = new JLabel("Prénom");
      labelPrenom.setPreferredSize(new Dimension(150, 20));
      labelPrenom.setForeground(Color.black);
      labelPrenom.setFont(police);
      labelPanel.add(labelPrenom);

      JLabel labelMoy = new JLabel("Moy");
      labelMoy.setPreferredSize(new Dimension(50, 20));
      labelMoy.setForeground(Color.black);
      labelMoy.setFont(police);
      labelPanel.add(labelMoy);

      JLabel labelAPDJ = new JLabel("APDJ");
      labelAPDJ.setPreferredSize(new Dimension(60, 20));
      labelAPDJ.setForeground(Color.black);
      labelAPDJ.setFont(police);
      labelPanel.add(labelAPDJ);

      blocEtudiants.setSize(new Dimension(470, 250));


      /*infosEtudiants.add(numEtudiants[0]);
      infosEtudiants.add(lesEtudiants[0][0]);
      infosEtudiants.add(lesEtudiants[0][1]);
      infosEtudiants.add(lesEtudiants[0][2]);
      infosEtudiants.add(APDJEtudiant[0]);*/

      panelEtudiants.add(labelPanel);
      infosEtudiants.setPreferredSize(new Dimension(490, 250));
      blocEtudiants.add(infosEtudiants, "Center");
      ascenseur = new JScrollPane();
      ascenseur.setSize(new Dimension(490, 250));
      ascenseur.setComponentOrientation(ComponentOrientation.UNKNOWN);
      ascenseur.setViewportView(blocEtudiants);
      panelEtudiants.add(ascenseur);

      contrainte.insets = new Insets(10, 0, 0, 0);
      contrainte.gridwidth = 5;
      contrainte.gridheight = 8;
      contrainte.gridx = 0;
      contrainte.gridy = 5;
      conteneur.add(panelEtudiants, contrainte);

      hintManager.addHintFor(panelStats, "Dans ce panneau, vous verrez le nombre total d'étudiants, combien ont validé, combien ont échoué, et enfin la moyenne générale des étudiants affichés.");

      panelStats.setPreferredSize(new Dimension(300, 150));
      panelStats.setBorder(BorderFactory.createTitledBorder(""));

      JLabel labelStats = new JLabel("Statistiques");
      labelStats.setPreferredSize(new Dimension(150, 30));
      labelStats.setForeground(Color.black);
      labelStats.setFont(police);
      panelStats.add(labelStats);

      JLabel labelTotal = new JLabel("Total etudiants:");
      labelTotal.setFont(police);
      labelTotal.setForeground(Color.black);
      labelTotal.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelTotal);

      jtfTotal.setPreferredSize(new Dimension(40, 20));
      jtfTotal.setEditable(false);
      panelStats.add(jtfTotal);

      JLabel labelMoyenne = new JLabel("Moyenne:");
      labelMoyenne.setForeground(Color.black);
      labelMoyenne.setFont(police);
      labelMoyenne.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelMoyenne);

      jtfMoyenne.setPreferredSize(new Dimension(40, 20));
      jtfMoyenne.setEditable(false);
      jtfMoyenne.setForeground(Color.blue);
      panelStats.add(jtfMoyenne);

      JLabel labelMax = new JLabel("Maximum:");
      labelMax.setFont(police);
      labelMax.setForeground(Color.black);
      labelMax.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelMax);

      jtfMax.setPreferredSize(new Dimension(40, 20));
      jtfMax.setEditable(false);
      panelStats.add(jtfMax);

      JLabel labelMin = new JLabel("Minimum:");
      labelMin.setFont(police);
      labelMin.setForeground(Color.black);
      labelMin.setPreferredSize(new Dimension(230, 20));
      panelStats.add(labelMin);

      jtfMin.setPreferredSize(new Dimension(40, 20));
      jtfMin.setEditable(false);
      panelStats.add(jtfMin);

      contrainte.insets = new Insets(10, 20, 0, 0);
      contrainte.anchor = GridBagConstraints.SOUTHWEST;
      contrainte.gridx = 0;
      contrainte.gridy = 15;
      contrainte.gridheight = 6;
      conteneur.add(panelStats, contrainte);

      boutonImporter.setActionCommand("Importer");
      boutonImporter.setPreferredSize(new Dimension(140, 25));
      boutonImporter.setFont(police);
      boutonImporter.addActionListener(this);
      boutonImporter.setEnabled(false);
      contrainte.anchor = GridBagConstraints.CENTER;
      contrainte.gridx = 0;
      contrainte.gridy = 13;
      conteneur.add(boutonImporter, contrainte);

      Actualiser.setActionCommand("Actualiser");
      Actualiser.setPreferredSize(new Dimension(140, 25));
      Actualiser.addActionListener(this);
      Actualiser.setFont(police);
      Actualiser.setOpaque(false);
      Actualiser.setEnabled(false);
      contrainte.gridx = 2;
      contrainte.gridwidth = 1;
      conteneur.add(Actualiser, contrainte);

      Valider.setActionCommand("Valider");
      Valider.setPreferredSize(new Dimension(140, 25));
      Valider.addActionListener(this);
      Valider.setFont(police);
      Valider.setEnabled(false);
      contrainte.anchor = GridBagConstraints.EAST;
      contrainte.gridx = 4;
      conteneur.add(Valider, contrainte);

      labelBulle.setLineWrap(true);
      labelBulle.setWrapStyleWord(true);
      labelBulle.setPreferredSize(new Dimension(300, 120));
      labelBulle.setBorder(BorderFactory.createTitledBorder("Infos..."));
      contrainte.gridx = 20;
      contrainte.gridy = 14;
      contrainte.gridheight = 8;
      contrainte.gridwidth = 4;
      contrainte.anchor = GridBagConstraints.SOUTHEAST;
      conteneur.add(labelBulle, contrainte);

      hintManager.addHintFor(conteneur, "Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
      conteneur.setSize(new Dimension(1024, 768));
      Fond.add(conteneur);
      Fond.setSize(new Dimension(1024, 768));
      superpoz.setPreferredSize(new Dimension(1024, 768));
      superpoz.add(Fond);

      sablier.setOpaque(false);
      sablier.setSize(new Dimension(1024, 768));
      //sablier.setIcon(new ImageIcon(this.getClass().getResource(".sablier1.gif")));
      sablier.setBounds(380, 200, 160, 120);
      superpoz.add(sablier);
      superpoz.moveToFront(sablier);

      add(superpoz);
      setJMenuBar(barreMenu);
      hintManager.enableHints(this);
      setLocation(ecran.width / 2 - 400, ecran.height / 2 - 300);
      setSize(new Dimension(1024, 768));
      setResizable(false);
      setLayout(new FlowLayout(0, 0, 0));
      setVisible(true);
      boxDepartements.setEnabled(false);
      boxAnnee.setEnabled(false);
      boxUE.setEnabled(false);
      blocEtudiants.setOpaque(false);
      labelPanel.setOpaque(false);
      infosEtudiants.setOpaque(false);
      panelEtudiants.setOpaque(false);
      ascenseur.setOpaque(false);
      ascenseur.getViewport().setOpaque(false);
      panelBoutons.setOpaque(false);
      panelStats.setOpaque(false);
      labelStats.setOpaque(false);
      labelMax.setOpaque(false);
      labelMin.setOpaque(false);
      labelMoyenne.setOpaque(false);
      boutonImporter.setOpaque(false);
      Valider.setOpaque(false);
      labelBulle.setOpaque(false);
      conteneur.setOpaque(false);
      this.addWindowListener(new WindowAdapter()
      {
         /**
          * cette petite fonction nous permet de spécifier l'action effectuée lorsqu'on clique sur la croix.
          * Ici, on réduit la fenetre courante et on affiche la fenetre d'accueil
          */
         public void windowClosing(WindowEvent we)
         {
            ((ResponsableUE) we.getSource()).myAccueil.setVisible(true);
            ((ResponsableUE) we.getSource()).setVisible(false);
         }
      });
      try
      {
         Iterator iter = myControlleur.getLesDepartementsView().iterator();
         if (!iter.hasNext())
         {
            display("Aucun département n'est présent dans la bd !");
         }
         else
         {
            while (iter.hasNext())
            {
               boxDepartements.addItem((String) iter.next());
            }
            labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
            boxDepartements.addActionListener(this);
            boxDepartements.setEnabled(true);
         }
      }
      catch (Exception ex)
      {
         ex.printStackTrace();
         display(ex.toString());
      }
      SimpleDateFormat formatter = new SimpleDateFormat("MMdd");
      Date currentTime_1 = new Date();
      currentDateInt = Integer.parseInt(formatter.format(currentTime_1));
      superpoz.moveToFront(Fond);
   }

   /**
    * Fonction qui permet de traiter tous les évènements (cliques sur les elements des listes, clique sur une Checkbox, sur un bouton, sur un champ de note d'un etudiant,...)
    * @param e evenement déclenché (clic sur un bouton, choix dans une liste,...
    */
   public void actionPerformed(ActionEvent e)
   {
      if (e.getActionCommand().equals("changeDep"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     myControlleur.enregistrerAPDJ();
                  }
                  nbModifications = 0;
               }
            }
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), -1, -1, -1, -1);
            viderLesAnnees();
            Iterator iter;

            iter = myControlleur.getLesAnneesView().iterator();
            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucune année ne correspond à votre recherche !"));
               blocEtudiants.setSize(new Dimension(470, 250));
               ascenseur.setSize(new Dimension(490, 250));
            }
            else
            {
               while (iter.hasNext())
               {
                  boxAnnee.addItem((String) iter.next());
               }
               boxAnnee.addActionListener(this);
               boxAnnee.setEnabled(true);
            }
         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des années !");
         }
      }

      if (e.getActionCommand().equals("changeAnnee"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     myControlleur.enregistrerAPDJ();
                  }
                  nbModifications = 0;
               }
            }
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), boxAnnee.getSelectedIndex(), -1, -1, -1);
            viderLesUEs();

            Iterator iter = myControlleur.getLesUECourantes().iterator();

            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucune UE ne correspond à votre recherche !"));
               blocEtudiants.setSize(new Dimension(470, 250));
               ascenseur.setSize(new Dimension(490, 250));
            }
            else
            {
               while (iter.hasNext())
               {
                  boxUE.addItem((String) iter.next());
               }
               boxUE.addActionListener(this);
               boxUE.setEnabled(true);
            }

         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des matières !");
         }
      }
      else if (e.getActionCommand().equals("changeUE"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerAPDJ();
                  }
                  nbModifications = 0;
               }
            }
            superpoz.moveToFront(sablier);
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), boxAnnee.getSelectedIndex(), -1, boxUE.getSelectedIndex(), -1);//boxUE.getSelectedIndex(), -1);

            viderLesEtudiants();
            Iterator iter, iterECUE;

            iterECUE = myControlleur.getLesECUEView().iterator();
            iter = myControlleur.getLesEtudiantsUEView().iterator();

            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucun étudiant ne correspond à votre recherche !"));
               blocEtudiants.setSize(new Dimension(470, 250));
               ascenseur.setSize(new Dimension(490, 250));
            }
            else
            {
               lesEtudiants = new JTextField[myControlleur.getLesEtudiantsUEView().size()][3 + myControlleur.getLesECUEView().size()];

               Map<String, String> currentEtud;
               float currentNote;
               currentNbEtud = 0;
               while (iter.hasNext())
               {
                  currentEtud = (HashMap) iter.next();

                  numEtudiants[currentNbEtud] = new JLabel("" + (currentNbEtud + 1) + ".");
                  numEtudiants[currentNbEtud].setPreferredSize(new Dimension(30, 20));
                  infosEtudiants.add(numEtudiants[currentNbEtud]);

                  APDJEtudiant[currentNbEtud] = new JCheckBox("APDJ");
                  APDJEtudiant[currentNbEtud].setOpaque(false);
                  APDJEtudiant[currentNbEtud].setActionCommand("" + currentNbEtud);
                  APDJEtudiant[currentNbEtud].setSelected(false);
                  APDJEtudiant[currentNbEtud].addActionListener(this);
                  if (currentEtud.get("estAPDJ").equals("1"))
                  {
                     APDJEtudiant[currentNbEtud].setSelected(true);
                  }

                  for (int j = 0; j < (2 + myControlleur.getLesECUEView().size() + 1); j++)
                  {
                     lesEtudiants[currentNbEtud][j] = new JTextField();
                     infosEtudiants.add(lesEtudiants[currentNbEtud][j]);
                     if (j < 2)
                     {
                        lesEtudiants[currentNbEtud][j].setPreferredSize(new Dimension(150, 20));
                     }
                     else
                     {
                        lesEtudiants[currentNbEtud][j].setPreferredSize(new Dimension(50, 20));
                        if (j == 2)
                        {
                           lesEtudiants[currentNbEtud][j].setText(df.format(Double.parseDouble(currentEtud.get("moyenneUE"))));
                           infosEtudiants.add(APDJEtudiant[currentNbEtud]);
                        }
                        else
                        {
                           lesEtudiants[currentNbEtud][j].setText(currentEtud.get(myControlleur.getLesECUEView().get(j - 3)));
                        }
                     }
                     lesEtudiants[currentNbEtud][j].setEditable(false);
                  }
                  lesEtudiants[currentNbEtud][0].setText(currentEtud.get("unNom"));
                  lesEtudiants[currentNbEtud][1].setText(currentEtud.get("unPrenom"));
                  if (Float.parseFloat(lesEtudiants[currentNbEtud][2].getText().replace(',', '.')) < 10)
                  {
                     lesEtudiants[currentNbEtud][2].setForeground(Color.red);
                  }
                  else
                  {
                     lesEtudiants[currentNbEtud][2].setForeground(Color.black);
                     APDJEtudiant[currentNbEtud].setEnabled(false);
                  }

                  currentNbEtud = currentNbEtud + 1;
               }


               if (!iterECUE.hasNext())
               {
                  display("AUCUNE ECUE n'a été trouvée pour cette UE !");
               }
               else
               {
                  JLabel currentECUE;
                  //int indiceTab = 3;
                  while (iterECUE.hasNext())
                  {
                     
                     currentECUE = new JLabel(myControlleur.getAbreviation((String) iterECUE.next()));
                     currentECUE.setPreferredSize(new Dimension(45, 20));
                     currentECUE.setFont(police);
                     currentECUE.setForeground(Color.black);
                     labelPanel.add(currentECUE);
                  }
                  labelPanel.setPreferredSize(new Dimension(470 + 50 * myControlleur.getLesECUEView().size(), 25));
               }
               blocEtudiants.setPreferredSize(new Dimension(470 + 40 * (myControlleur.getLesECUEView() .size()+ 1), 28 * currentNbEtud + 5));
               panelEtudiants.setPreferredSize(new Dimension(550 + 50 * (myControlleur.getLesECUEView() .size()+ 1), 290));
               infosEtudiants.setPreferredSize(new Dimension(470 + 50 * (myControlleur.getLesECUEView() .size()+ 1), 250));
               ascenseur.setPreferredSize(new Dimension(480 + 45 * (myControlleur.getLesECUEView() .size()+ 1), 250));
               for (int i = 0; i < 5; i++)
               {
                  alphaButton[i].setEnabled(true);
               }
               Actualiser.setEnabled(true);
               boutonImporter.setEnabled(true);
               Valider.setEnabled(true);
            }
            remplirStats();
         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des etudiants");
         }
         finally
         {
            infosEtudiants.updateUI();
            superpoz.moveToFront(Fond);
         }
      }
      else if (e.getSource().getClass().getSimpleName().equals("JCheckBox"))
      {
         try
         {
            nbModifications++;
            if (APDJEtudiant[Integer.parseInt(e.getActionCommand())].isSelected())
            {
               myControlleur.setAPDJ(lesEtudiants[Integer.parseInt(e.getActionCommand())][0].getText(), lesEtudiants[Integer.parseInt(e.getActionCommand())][1].getText(), "true");
            }
            else
            {
               myControlleur.setAPDJ(lesEtudiants[Integer.parseInt(e.getActionCommand())][0].getText(), lesEtudiants[Integer.parseInt(e.getActionCommand())][1].getText(), "false");
            }
         }
         catch (Exception ex)
         {
            display("Erreur lors de l'attribution de l'APDJ !");
            ex.printStackTrace();
         }
      }
      else if (e.getActionCommand().equals("Valider"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Etes-vous sûr(e) ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerAPDJ();
                     superpoz.moveToFront(Fond);
                  }
                  myControlleur.actualiserEtudiants();
                  nbModifications = 0;
               }
            }
         }
         catch (Exception ex)
         {
            display("Erreur lors de la validation !");
            ex.printStackTrace();
         }
      }
      else if (e.getActionCommand().equals("Actualiser"))
      {
         superpoz.moveToFront(sablier);
         viderLesEtudiants();
         infosEtudiants.updateUI();
         try
         {            
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerAPDJ();
                  }
                  myControlleur.actualiserEtudiants();
                  nbModifications = 0;
               }
            }
            else
               myControlleur.actualiserEtudiants();
            
            superpoz.moveToFront(sablier);
            myControlleur.updateStructure(boxDepartements.getSelectedIndex(), boxAnnee.getSelectedIndex(), -1, boxUE.getSelectedIndex(), -1);//boxUE.getSelectedIndex(), -1);

            viderLesEtudiants();
            Iterator iter, iterECUE;

            iterECUE = myControlleur.getLesECUEView().iterator();
            iter = myControlleur.getLesEtudiantsUEView().iterator();

            if (!iter.hasNext())
            {
               infosEtudiants.add(new JLabel("Aucun étudiant ne correspond à votre recherche !"));
               blocEtudiants.setSize(new Dimension(470, 250));
               ascenseur.setSize(new Dimension(490, 250));
            }
            else
            {
               lesEtudiants = new JTextField[myControlleur.getLesEtudiantsUEView().size()][3 + myControlleur.getLesECUEView().size()];

               Map<String, String> currentEtud;
               float currentNote;
               currentNbEtud = 0;
               while (iter.hasNext())
               {
                  currentEtud = (HashMap) iter.next();

                  numEtudiants[currentNbEtud] = new JLabel("" + (currentNbEtud + 1) + ".");
                  numEtudiants[currentNbEtud].setPreferredSize(new Dimension(30, 20));
                  infosEtudiants.add(numEtudiants[currentNbEtud]);

                  APDJEtudiant[currentNbEtud] = new JCheckBox("APDJ");
                  APDJEtudiant[currentNbEtud].setOpaque(false);
                  APDJEtudiant[currentNbEtud].setActionCommand("" + currentNbEtud);
                  APDJEtudiant[currentNbEtud].setSelected(false);
                  APDJEtudiant[currentNbEtud].addActionListener(this);
                  if (currentEtud.get("estAPDJ").equals("1"))
                  {
                     APDJEtudiant[currentNbEtud].setSelected(true);
                  }

                  for (int j = 0; j < (2 + myControlleur.getLesECUEView().size() + 1); j++)
                  {
                     lesEtudiants[currentNbEtud][j] = new JTextField();
                     infosEtudiants.add(lesEtudiants[currentNbEtud][j]);
                     if (j < 2)
                     {
                        lesEtudiants[currentNbEtud][j].setPreferredSize(new Dimension(150, 20));
                     }
                     else
                     {
                        lesEtudiants[currentNbEtud][j].setPreferredSize(new Dimension(50, 20));
                        if (j == 2)
                        {
                           lesEtudiants[currentNbEtud][j].setText(df.format(Double.parseDouble(currentEtud.get("moyenneUE"))));
                           infosEtudiants.add(APDJEtudiant[currentNbEtud]);
                        }
                        else
                        {
                           lesEtudiants[currentNbEtud][j].setText(currentEtud.get(myControlleur.getLesECUEView().get(j - 3)));
                        }
                     }
                     lesEtudiants[currentNbEtud][j].setEditable(false);
                  }
                  lesEtudiants[currentNbEtud][0].setText(currentEtud.get("unNom"));
                  lesEtudiants[currentNbEtud][1].setText(currentEtud.get("unPrenom"));
                  if (Float.parseFloat(lesEtudiants[currentNbEtud][2].getText().replace(',', '.')) < 10)
                  {
                     lesEtudiants[currentNbEtud][2].setForeground(Color.red);
                  }
                  else
                  {
                     lesEtudiants[currentNbEtud][2].setForeground(Color.black);
                     APDJEtudiant[currentNbEtud].setEnabled(false);
                  }

                  currentNbEtud = currentNbEtud + 1;
               }


               if (!iterECUE.hasNext())
               {
                  display("AUCUNE ECUE n'a été trouvée pour cette UE !");
               }
               else
               {
                  JLabel currentECUE;
                  //int indiceTab = 3;
                  while (iterECUE.hasNext())
                  {
                     
                     currentECUE = new JLabel(myControlleur.getAbreviation((String) iterECUE.next()));
                     currentECUE.setPreferredSize(new Dimension(45, 20));
                     currentECUE.setFont(police);
                     currentECUE.setForeground(Color.black);
                     labelPanel.add(currentECUE);
                  }
                  labelPanel.setPreferredSize(new Dimension(470 + 50 * myControlleur.getLesECUEView().size(), 25));
               }
               blocEtudiants.setPreferredSize(new Dimension(470 + 40 * (myControlleur.getLesECUEView() .size()+ 1), 28 * currentNbEtud + 5));
               panelEtudiants.setPreferredSize(new Dimension(550 + 50 * (myControlleur.getLesECUEView() .size()+ 1), 290));
               infosEtudiants.setPreferredSize(new Dimension(470 + 50 * (myControlleur.getLesECUEView() .size()+ 1), 250));
               ascenseur.setPreferredSize(new Dimension(480 + 45 * (myControlleur.getLesECUEView() .size()+ 1), 250));
               for (int i = 0; i < 5; i++)
               {
                  alphaButton[i].setEnabled(true);
               }
               Actualiser.setEnabled(true);
               boutonImporter.setEnabled(true);
               Valider.setEnabled(true);
            }
            remplirStats();

         }
         catch (Exception ex)
         {
            display("Erreur pendant l'actualisation !");
            ex.printStackTrace();
         }
         finally
         {
            superpoz.moveToFront(Fond);
            infosEtudiants.updateUI();
         }
      }
      else if (e.getActionCommand().equals("Importer") || e.getActionCommand().equals("Exporter"))
      {
         display("Les fonction Importer/Exporter ne sont pas encore implémentée !!!");
      }
      else if (e.getSource().getClass().getSimpleName().equals("JButton"))
      {
         filtreLesEtudiants(e.getActionCommand());
      }
      else if (e.getSource().getClass().getSimpleName().equals("JCheckBox"))
      {
         nbModifications = nbModifications + 1;
      }
      else if (e.getActionCommand().equals("APropos"))
      {
         textAPropos();
      }
      else if (e.getActionCommand().equals("Support"))
      {
         aide();
      }
      else if (e.getActionCommand().equals("Quitter"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer avant de quitter l'application ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  if (option == 0)
                  {
                     superpoz.moveToFront(sablier);
                     myControlleur.enregistrerAPDJ();
                     superpoz.moveToFront(Fond);
                  }
                  this.myAccueil.setVisible(true);
                  this.setVisible(false);
               }
            }
            else
            {
               this.myAccueil.setVisible(true);
               this.setVisible(false);
            }
         }
         catch (Exception ex)
         {
            display("Erreur lors de la fermeture du programme !");
            ex.printStackTrace();
         }
      }
      else if (e.getActionCommand().equals("Nouveau"))
      {
         try
         {
            if (nbModifications != 0)
            {
               JOptionPane jop = new JOptionPane();
               int option = JOptionPane.showConfirmDialog(null, "Voulez-vous enregistrer les modifications ?", "Confirmation", 1, 3);
               if (option != 2)
               {
                  superpoz.moveToFront(sablier);
                  if (option == 0)
                  {
                     myControlleur.enregistrerAPDJ();
                  }                  
                  viderLesAnnees();

                  for (int i = 0; i < 5; i++)
                  {
                     alphaButton[i].setEnabled(false);
                  }

                  boxDepartements.removeActionListener(this);
                  boxDepartements.removeAllItems();
                  boxDepartements.setEnabled(false);
                  boxAnnee.setEnabled(false);
                  boxUE.setEnabled(false);


                  Iterator iter = myControlleur.getLesDepartementsView().iterator();
                  if (!iter.hasNext())
                  {
                     display("Aucun département n'est présent dans la bd !");
                  }
                  else
                  {
                     while (iter.hasNext())
                     {
                        boxDepartements.addItem((String) iter.next());
                     }
                     labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
                     boxDepartements.addActionListener(this);
                     boxDepartements.setEnabled(true);
                  }
               }
            }
            else
            {
               superpoz.moveToFront(sablier);
               viderLesAnnees();

               for (int i = 0; i < 5; i++)
               {
                  alphaButton[i].setEnabled(false);
               }

               boxDepartements.removeActionListener(this);
               boxDepartements.removeAllItems();
               boxDepartements.setEnabled(false);
               boxAnnee.setEnabled(false);
               boxUE.setEnabled(false);

               try
               {
                  Iterator iter = myControlleur.getLesDepartementsView().iterator();
                  if (!iter.hasNext())
                  {
                     display("Aucun département n'est présent dans la bd !");
                  }
                  else
                  {
                     while (iter.hasNext())
                     {
                        boxDepartements.addItem((String) iter.next());
                     }
                     labelBulle.setText("Veuillez choisir un département, une année et enfin une matière pour entrer des notes.");
                     boxDepartements.addActionListener(this);
                     boxDepartements.setEnabled(true);
                  }

               }
               catch (Exception ex)
               {
                  ex.printStackTrace();
                  display("Erreur lors du chargement des départements !");
               }
               superpoz.moveToFront(Fond);
            }
            myControlleur.actualiserEtudiants();
            nbModifications = 0;
         }
         catch (Exception ex)
         {
            ex.printStackTrace();
            display("Erreur lors du chargement des départements !");
         }
         finally
         {
            superpoz.moveToFront(Fond);
         }
      }

   }

   /**
    * Fonction qui permet de vider le panneau des étudiant
    */
   public void viderLesEtudiants()
   {
      Actualiser.setEnabled(false);
      boutonImporter.setEnabled(false);
      Valider.setEnabled(false);
      for (int i = 0; i < 5; i++)
      {
         alphaButton[i].setEnabled(false);
      }
      infosEtudiants.removeAll();

      blocEtudiants.setSize(new Dimension(470, 250));
      ascenseur.setSize(new Dimension(490, 250));
      infosEtudiants.updateUI();
      viderLesStats();
   }

   /**
    * Fonction qui permet de n'afficher qu'uniquement les etudiants dont le nom se situe entre les deux lettres de la chaine en paramètre.
    * @param intervalle chaine de 2 caractères qui précisent l'intervalle dans lequel le nom de l'etudiant doit être pour être affiché.
    */
   public void filtreLesEtudiants(String intervalle)
   {
      infosEtudiants.removeAll();
      Iterator iter;
      try
      {
         boolean unTrouve = false;
         int nbEtudiants = myControlleur.getLesEtudiantsUEView().size();
         for(int i = 0 ; i< nbEtudiants; i++)
         {
           if(lesEtudiants[i][0].getText().charAt(0)>= intervalle.charAt(0) && lesEtudiants[i][0].getText().charAt(0)<= intervalle.charAt(1))
           {
              unTrouve = true;
              infosEtudiants.add(numEtudiants[i]);
              infosEtudiants.add(lesEtudiants[i][0]);
              infosEtudiants.add(lesEtudiants[i][1]);
              infosEtudiants.add(lesEtudiants[i][2]);
              infosEtudiants.add(APDJEtudiant[i]);
              int j = 0;
              while (j< myControlleur.getLesECUEView().size())
              {
                 infosEtudiants.add(lesEtudiants[i][j+3]);
                 j = j + 1;
              }
           }
         }
         if (! unTrouve)
         {
            infosEtudiants.add(new JLabel("Aucun etudiant ne correspond à votre recherche."));            
         }         
      }
      catch (Exception ex)
      {
         display("Erreur lors du chargement des etudiants filtrés");
         ex.printStackTrace();
      }
      finally
      {
         infosEtudiants.updateUI();
      }
   }

   /**
    * fonction qui permet de vider le panel des statistiques
    */
   public void viderLesStats()
   {
      jtfMax.setText("");
      jtfMin.setText("");
      jtfMoyenne.setText("");
      jtfTotal.setText("");
      conteneur.updateUI();
   }

   /**
    * Fonction qui permet de remplir le panneau des statistiques
    */
   public void remplirStats()
   {
      try
      {
         Map<String, String> stats;
         stats = myControlleur.getStatsUE();
         jtfMax.setText(df.format(Double.parseDouble(stats.get("max"))));
         jtfMin.setText(df.format(Double.parseDouble(stats.get("min"))));
         jtfTotal.setText(stats.get("nbEleve"));
         jtfMoyenne.setText(df.format(Double.parseDouble(stats.get("moyenne"))));         
      }
      catch (Exception ex)
      {
         display("Erreur lors du chargement des stats !");
         ex.printStackTrace();
      }
      //jtfValid.setText(stats.get("valid"));
      //jtfEchoue.setText(stats.get("echoue"));

   }

   /**
    * Fonction qui vide la liste des années
    */
   public void viderLesAnnees()
   {
      boxAnnee.removeActionListener(this);
      boxAnnee.removeAllItems();
      boxAnnee.setEnabled(false);
      viderLesUEs();
   }

   /**
    * Fonction qui vide la liste des UE
    */
   public void viderLesUEs()
   {
      boxUE.removeActionListener(this);
      boxUE.removeAllItems();
      boxUE.setEnabled(false);
      viderLesEtudiants();
   }

   /**
    * Fonction qui permet d'afficher des informations à l'utilisateur (sous forme de boite de dialogue)
    * @param message chaine de caractère à afficher
    */
   public final void display(String message)
   {
      JOptionPane.showMessageDialog(this, message);
   }

   /**
    * Fonction d'affichage de la fenetre du menu "A propos"    *
    */
   public void textAPropos()
   {
      JFrame propos = new JFrame(" A propos...");
      propos.setLayout(new BorderLayout());
      propos.setSize(new Dimension(400, 400));
      propos.setLocationRelativeTo(this);
      JTextArea jtA = new JTextArea();
      jtA.setText("Bonjour et Bienvenue dans le module de gestion des APDJ des Etudiants de Polytech Montpellier !\nUtilisation du module:\n\n");
      jtA.setText(jtA.getText() + "Vous n'avez accès qu'aux départements qui vous concernent.");
      jtA.setText(jtA.getText() + "Vous devez selectionner un departement dans la liste deroulante. Les années correspondante seront chargées dans la seconde liste.\n");
      jtA.setText(jtA.getText() + "Vous devez ensuite selectionner l'année dans la seconde liste. Les UE correspondante seront chargées dans la dernière liste.\n");
      jtA.setText(jtA.getText() + "Lorsque vous selectionez une UE, les etudiants inscrits seront affichés dans le panneau dessous, avec leur moyenne sur l'UE, et toutes leurs notes ( si rensignées), dans les ECUE de cette UE.\n");
      jtA.setText(jtA.getText() + "Pour éviter de devoir descendre tout en bas pour voir les dernier etudiants, nous avons ajout\351 des boutons de filtre. Si vous cliquez sur un bouton, seul les etudiants dont le nom se situe entre les lettre du bouton seront affichés.\n");
      jtA.setText(jtA.getText() + "En bas, vous pouvez voir un panneau de statistiques qui indique le nombre d'etudiants total, la moyenne de la promo sur l'UE, et les moyennes minimale et maximale obtenues dans cette UE\n");
      jtA.setText(jtA.getText() + "Dans le panneau, les etudiants qui n'ont pas validé voient leur moyenne affichée en rouge, et ceux qui ont validé ont leur moyenne en vert.\n");
      jtA.setText(jtA.getText() + "Enfin, une info Bulle en bas à droite vous aide tout au long de l'utilisation du programme. Si vous passez la souris sur un bouton ou une liste ou quoi que ce soit, l'info bulle est là pour vous aider.");
      jtA.setLineWrap(true);
      jtA.setWrapStyleWord(true);
      jtA.setEditable(false);
      propos.add(jtA);
      propos.setLocation(ecran.width / 2 - 200, ecran.height / 2 - 200);
      propos.setVisible(true);
   }

   /**
    * Fonction d'affichage de la fenetre du menu "Aide"
    */
   public void aide()
   {
      JFrame propos = new JFrame(" A propos...");
      propos.setLayout(new BorderLayout());
      propos.setSize(new Dimension(400, 200));
      propos.setLocationRelativeTo(this);
      JTextArea jtA = new JTextArea();
      jtA.setText("Un problème ? Ce serait étonnant mais bon. Consultez le menu \" A Propos\".\nSi cela ne vous a pas aidé, contactez notre équipe ! ;-)");
      jtA.setLineWrap(true);
      jtA.setWrapStyleWord(true);
      jtA.setEditable(false);
      propos.add(jtA);
      propos.setLocation(ecran.width / 2 - 200, ecran.height / 2 - 200);
      propos.setVisible(true);
   }
}
